package day18_Reflection.demo03_Con;

import java.lang.reflect.Constructor;

//反射通过构造创建对象
/*
Class类中用与使用构造的方法
T newInstance(Object... initargs);根据指定的构造方法创建对象
注意:通过反射私有化构造不能直接创建对象需要通过setAccessible方法
 */
public class Test01 {
    public static void main(String[] args) throws Exception {
        Class<User> userClass = User.class;
        Constructor<User> constructor = userClass.getConstructor();
//        User user = userClass.newInstance();
//        System.out.println(user.age);//用userClass无参
        User user = constructor.newInstance();
        System.out.println(user.age);
        System.out.println("--------");
        //获取公共有参的
        Constructor<User> constructors = userClass.getConstructor(int.class);
        User user3 = constructors.newInstance(20);
        System.out.println(user3.age);
        System.out.println("---------");
        //获取私有的
        //通过反射私有化构造不能直接创建对象需要通过setAccessible方法
        //在创建对象之前调用setAccessible方法
        Constructor<User> declaredConstructor = userClass.getDeclaredConstructor(int.class);
        User user1 = declaredConstructor.newInstance(30);
        System.out.println(user1.age);
        System.out.println("--------");
        Constructor<User> declaredConstructor1 = userClass.getDeclaredConstructor(int.class, String.class);
        declaredConstructor1.setAccessible(true);//通过反射私有化构造不能直接创建对象需要通过setAccessible方法
        User user2 = declaredConstructor1.newInstance(30,"csw");
        System.out.println(user2.age+":"+user2.name);
    }
}
